From 9cc64579c2196e6bd9c5c71cd63945b3d152fbab Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Wed, 27 Mar 2013 11:47:37 +0100 Subject: [PATCH] gdkwindow: Apply layered areas to the shape for native windows If a window is overlapped by a layered (i.e. partially transparent) window then that region will not disappear from the native window clip region. This lets us handle compositing multiple layers of windows. For native subwindows this doesn't really work. For them we apply the clip region as a shape to the native window which lets us have client side windows overlapping the native window. However, with the addition of the layered stuff the "overlapped-by-alpha-csw" part got broken, as this area is not removed from the clip region of the native window. We fix this by also removing the layered area when applying the shape. This means alpha and alpha backgrounds don't work over native windows, but there is not much to do about that. https://bugzilla.gnome.org/show_bug.cgi?id=696370 --- gdk/gdkwindow.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 768620060f..f9628f3e8e 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -940,19 +940,26 @@ static void apply_clip_as_shape (GdkWindow *window) { GdkRectangle r; + cairo_region_t *region; r.x = r.y = 0; r.width = window->width; r.height = window->height; + region = cairo_region_copy (window->clip_region); + if (window->layered_region) + cairo_region_subtract (region, window->layered_region); + /* We only apply the clip region if would differ from the actual clip region implied by the size of the window. This is to avoid unneccessarily adding meaningless shapes to all native subwindows */ - if (!region_rect_equal (window->clip_region, &r)) - apply_shape (window, window->clip_region); + if (!region_rect_equal (region, &r)) + apply_shape (window, region); else apply_shape (window, NULL); + + cairo_region_destroy (region); } static void -- 2.30.2